// 程序七：定时炸弹演示
console.log('=== 定时炸弹演示 ===');

// Bomb构造函数
function Bomb(name) {
    this.name = name;
    this.timer = null;
    this.isActive = false;
    this.startTime = null;
    
    // 启动定时器方法
    this.start = function() {
        if (this.isActive) {
            console.log(`[${this.name}] 炸弹已经在运行中！`);
            return;
        }
        
        console.log(`[${this.name}] 炸弹已启动，3秒后爆炸！`);
        this.isActive = true;
        this.startTime = Date.now();
        
        // 设置3秒定时器
        this.timer = setTimeout(() => {
            this.explode();
        }, 3000);
        
        // 显示倒计时
        this.countdown();
    };
    
    // 取消定时器方法
    this.clear = function() {
        if (!this.isActive) {
            console.log(`[${this.name}] 炸弹没有在运行！`);
            return;
        }
        
        if (this.timer) {
            clearTimeout(this.timer);
            this.timer = null;
        }
        
        const elapsed = Date.now() - this.startTime;
        console.log(`[${this.name}] 炸弹已被拆除！运行了 ${elapsed}ms`);
        this.isActive = false;
    };
    
    // 爆炸方法
    this.explode = function() {
        console.log(`💥 [${this.name}] BOOM! 炸弹爆炸了！`);
        this.isActive = false;
        this.timer = null;
    };
    
    // 倒计时显示
    this.countdown = function() {
        let count = 3;
        const countdownInterval = setInterval(() => {
            if (!this.isActive) {
                clearInterval(countdownInterval);
                return;
            }
            
            console.log(`[${this.name}] 倒计时: ${count}...`);
            count--;
            
            if (count < 0) {
                clearInterval(countdownInterval);
            }
        }, 1000);
    };
    
    // 获取状态方法
    this.getStatus = function() {
        return {
            name: this.name,
            isActive: this.isActive,
            hasTimer: this.timer !== null,
            startTime: this.startTime
        };
    };
}

// 创建两个炸弹实例
console.log('创建炸弹实例...');
const b1 = new Bomb('炸弹1');
const b2 = new Bomb('炸弹2');

console.log('\n=== 开始测试 ===');

// 显示初始状态
console.log('初始状态:');
console.log('b1状态:', b1.getStatus());
console.log('b2状态:', b2.getStatus());

// b1 启动
console.log('\n--- 启动 b1 ---');
b1.start();

// b2 启动
console.log('\n--- 启动 b2 ---');
b2.start();

// 1秒后拆除 b2
setTimeout(() => {
    console.log('\n--- 1秒后拆除 b2 ---');
    b2.clear();
}, 1000);

// 显示最终状态
setTimeout(() => {
    console.log('\n=== 最终状态 ===');
    console.log('b1状态:', b1.getStatus());
    console.log('b2状态:', b2.getStatus());
    
    console.log('\n=== 测试完成 ===');
    console.log('预期结果:');
    console.log('- b1 应该在3秒后爆炸');
    console.log('- b2 应该在1秒后被拆除，不会爆炸');
    
    // 程序结束
    setTimeout(() => {
        console.log('\n程序结束');
        process.exit(0);
    }, 2000);
}, 5000);

// 额外的测试功能
console.log('\n=== 额外功能演示 ===');

// 创建一个新的炸弹用于演示其他功能
const b3 = new Bomb('炸弹3');

setTimeout(() => {
    console.log('\n--- 测试重复启动 ---');
    b3.start();
    b3.start(); // 应该显示已经在运行中的消息
}, 6000);

setTimeout(() => {
    console.log('\n--- 测试重复拆除 ---');
    b3.clear();
    b3.clear(); // 应该显示没有在运行的消息
}, 7000);

setTimeout(() => {
    console.log('\n--- 测试正常流程 ---');
    b3.start();
    setTimeout(() => {
        b3.clear();
    }, 1500);
}, 8000);
